      


           孨᪨ ஡    
    ⥬  ࠢ.   ⥬  ॠ 
     祭 訥,   - 訩      
    ⥬ 䥪⨢  ࠫ  .

             ⥬ n  ࠢ  n ६:
        a11x1+ a12x2+ a13X3... + a1NxN = b1
        a21x1+ a22x2+ a23x3... + a2NxN = b2 (9.2)
        a31X1+ a32X2+ a33X3... + a3NxN = b3
           . . . . . . .  .  .  .  .  .  .
        aN1x1+ aN2x2+ aN3x3... + aNNxN = bN

    筮 ࠦ  Ax = b,  A -  n x n , x  b -
      n-⮢ - 襭 (୨) ࠢ  ࠢ
     ࠢ ᮮ⢥⢥ . ᯮ  祭
    ⫨   ⮢  A । ᪮쪮
    㤭  ⥬  ⭮⥫쭮 x.

    । .  n x n  A -  孥 㣮쭮
                   ଥ , ᫨
                        i > j = > Aij = 0

    । .  n x n  A -   㣮
                   ଥ, ᫨
                        i < j = > Aij = 0

    । .  n x n  A  -  ਤ쭮 ଥ,
                   ᫨
                        | i -  j | > 1 = > Aij =0

    । .  n x n   A  ஢  ,
                   ᫨
        | Aii | > SUM_i<>j | Aij |    1 <= i <= n.


         .

                ᬮਬ ࠫ  ⬠,  -
    㥬  襭  ⥬    Ax = b , 
    A -  孥 㣮쭮 ଥ. ।,   ⨬
     ⥬
                1x1 + 1x2 - 1x3 + 4x4 = 8
                     -2x2 - 3x3 + 1x4 = 5
                            2x3 - 3x4 = 0
                                  2x4 = 4

       ᫥ ࠢ ।⢥, ⠪ 
      ⮫쪮 筮 ⭮. ᫥ ⮣,  
    ।  x4 = 2,    㣨 ࠢ
    ⠢  x4 祭   ४஢  祭 b
    ମ:
                1x1 + 1x2 - 1x3     = 0
                    - 2x2 - 3x3     = 3
                            2x3     = 6
                                2x4 = 4

      ࠢ  ⮫쪮 筮 ⭮,
     ⮥  뤠 x3  =  3.  ,    -
    㥬  ଠ ⮡    ࠢ  
    ⮣:
                1x1 + 1x2           = 3
                    - 2x2           = 12
                           2x3      = 6
                                2x4 = 4
     ⨫ ஥ ࠢ ⮡ ᮤঠ  ⮫쪮  -
    筮 ⭮,    b2  a22    x2=-6. ᫥
    ⠭ ( x2 a12 )  b1  
                1x1              = 9
                    -2x2         = 12
                         2x3     = 6
                             2x4 = 4

       x1 = 9.


(* back substitution - 襭 ⥬ ࠢ  孥 *)
(* 㣮쭮 ଥ ⮤ ⭮ ⠭          *)
program parallel_backsub_1;
const   n=4;
var     x:array[1..n] of real;
        a:array[1..n,1..n] of real;
        b:array[1..n] of real;
        i:integer;
        j:integer;
begin
        for i:=1 to n do
          for j:=1 to n do
            begin
(*              writeln(' [',i,',',j,']: ');*)
                readln(a[i,j]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;

        for i:=n downto 1 do
         begin
          x[i]:=b[i]/a[i,i];
          forall j:=1 to n do
           begin
            b[j]:=b[j]-x[i]*a[j,i];
            a[j,i]:=0;
           end;
         end;
(*      for i:=1 to n do
                writeln(x[i]);*)
end.


           ⮬ ਬ       a11 a12 a13     <=  x3
    ᫥ 祭 xi ⠢-     0  a22 a23     <=  x3
     - ࠧ   ࠢ-      0   0  a33     <=  x3
     -  ᯮ  -
    ᫥ ᫥. 祭 (xi-1)           i=3
    .. 襭  - ࠢ-
     .

    ᫥⥫쭮 ६ 믮 :  758
    ࠫ쭮     --"--"--"--"--"--:  566
    ᪮७                         :  1.34
    ⢮ ஢         :  5     ( ⥬ 4  4)


!!!   ,    ⮬   ᫥ ⮢ ਬ
    - ᮡ⥩ 몠 MP  㤠  ᪫ -
    ⥫ 樨 /뢮 , .. ॠ쭮 ᪮७
    ⬮ ॢ蠥 ⭮


program parallel_back_substitution_variant_2;
 const
      n=4;
 var
      a:array[1..n,1..n] of real;
      b,x:array[1..n] of real;
      pipechan:array[1..n+1] of channel of real;
      i,k:integer;

 procedure pipeprocess(i:integer);
  var j:integer;
      sum,xvalue: real;
  begin
    sum:=0;
    for j:=1 to i-1 do
      begin
        xvalue:=pipechan[i];
        pipechan[i+1]:=xvalue;
        sum:=sum+ a[i,j]*xvalue;
      end;
    x[i]:=(b[i]-sum)/a[i,i];
    pipechan[i+1]:=x[i];
  end;

 begin
     for i:=1 to n do
          for k:=1 to n do
            begin
(*              writeln(' [',i,',',k,']: ');*)
                readln(a[i,k]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;

        forall i:=1 to n do
             pipeprocess(i);

(*      for i:=1 to n do
                writeln(x[i]);*)
end.

           ⮬ ਬ          a11 a12 a13
      蠣 祭 x ⠢-       0  a22 a23
     ६ ࠧ   ࠢ-       0   0  a33
     -  ᯮ ⠬  -
    ᫥ ᫥. 祭 (xi-1)           ^   ^      i=2
    , .. 襭  -          x2  x3
    ᭨-.

    ᫥⥫쭮 ६ 믮 :  611
    ࠫ쭮     --"--"--"--"--"--:  443
    ᪮७                         :  1.38
    ⢮ ஢         :  5     ( ⥬ 4  4)



        

                 ᮢo 㤠e - 饨  
     襭  ⥬ Ax = b    A  
    ⫨        ந  ᯮ.
    ᮢ 㤠 㬥蠥 Ax = b  孨  㣮
    ⥬ Tx = c,    ⭮⥫쭮  ⮤
    ⭠  ⠭.     ப 
    ⥬ 㬬 ⮩  ப   㣮 ப ⥬,
      㫥 ⥫. ᯮ㥬  ⮤
    ⮡ ࠭ ⫨      ᭮
     .
            㭮           11 12 13 14 15
      ⬠.            0  22 23 24 25
    ⫨             0   0  33 34 35
        ⮫          0   0  43 44 45
    㤠.  蠣 i ⫨           0   0  53 54 55
        
      ⮫ i 㤠塞,           i=3
       ப  j,
      i+1 <= j <= n,  㬬 ப j  cப i, 
     -a[j,i]/a[i,i] . ᫥ n - 1 ⠪ 樨,  
    ⥬ -  孥 㣮쭮 ଥ.
             ᠭ אַ ᮢ ⬥ 㤠 ,
    ப  i - pivot ப ,   ப ᯮ㥬 
    ࠢ 㫥  ⫨    ⮢ 
      ⮫ i.

program parallel_gaussian_ellimination_1;
const  n=4;
(*       a:array[1..n,1..n] of real=((5,6,1,8),
                                   (5,1,8,3),
                                   (5,1,4,3),
                                   (1,5,6,4));
       b:array[1..n] of real=(5,3,2,3); *)
var    x:array[1..n] of real;
       a:array[1..n,1..n] of real;
       b:array[1..n] of real;
       i,j,k:integer;
       tmp:real;

begin
        for i:=1 to n do
          for j:=1 to n do
            begin
(*              writeln(' [',i,',',j,']: ');*)
                readln(a[i,j]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;
(*   for i:=1 to n do begin
      for j:=1 to n do
        write(a[i,j]:10:1);
        writeln(b[i]:10:1);
    end;
    writeln; *)

    for i:=1 to n-1 do
        forall j:=1 to n do
            begin
              tmp:=a[j,i]/a[i,i];
              for k:=i to n do begin
                a[j,k]:=a[j,k] - a[i,k]*tmp;
                if abs(a[j,k])<1E-10 then a[j,k]:=0;
               end;
              b[j]:=b[j] - b[i]*tmp;
            end;

(*   for i:=1 to n do begin
      for j:=1 to n do
        write(a[i,j]:10:1);
        writeln(b[i]:10:1);
    end;
    writeln; *)

   (*  襭  ⮤ ⭮ ⠭ *)

end.

    ᫥⥫쭮 ६ 믮 :
    ࠫ쭮     --"--"--"--"--"--:
    ᪮७                         :
    ⢮ ஢         :        ( ⥬ 4  4)



                       室      
    ᫮  ⠡쭮    ஢  .  ,
    ⮩ ਠ, 뢠 ᮢ 㤠   
    ⮬, ந  १.  蠣  i  -
    ᮢ 㤠    ⮬,  ப  i - n
    饬 ப 祩  i- ⮫   ᠬ  讥
    ᮫⭮ 祭.  ப     ப  i .
                          ᯮ  ⥫
    pivot ப ( ⥯ ப i ) , ⮡   
    ⫨       ⮫ i  ப (i+1) - n.
      pivot ப  ப i    樨 ,
      ᯮ  ᢥ.    ᨢ
    pivot[i] ᮤন ⨢   ஬ ப i -
    짮  pivot ப. 㣮 ᨢ   -
    祭 । ᯮ짮  ᯥ᪠ ப
      pivot  ப;  ᨢ marked[i] ⠭ 
    1  ப  i  롨ࠥ  pivot ப. .. ப
     ⠢,    ᨢ , 騩
    ⠭ ப.

program parallel_gaussian_ellimination_2;
const  n=4;
(*       a:array[1..n,1..n] of real=((5,6,1,8),
                                   (5,1,8,3),
                                   (5,1,4,3),
                                   (1,5,6,4));
       b:array[1..n] of real=(5,3,2,3); *)
var    x:array[1..n] of real;
       a:array[1..n,1..n] of real;
       b:array[1..n] of real;
       marked:array[1..n] of integer;
       pivot:array[1..n] of integer;
       picked:integer;
       magnetude:real;
       winner:integer;
       i,j,k:integer;
       tmp:real;
       tmpv:array[1..n+1] of real;

procedure result;
begin
      for i:=1 to n do begin
        for j:=1 to n do
          write(a[pivot[i],j]:10:1);
        writeln(b[pivot[i]]:10:1);
      end;
      writeln;
end;

begin
        for i:=1 to n do
          for j:=1 to n do
            begin
(*              writeln(' [',i,',',j,']: ');*)
                readln(a[i,j]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;
(*   for i:=1 to n do begin
      for j:=1 to n do
        write(a[i,j]:10:1);
        writeln(b[i]:10:1);
    end;
    writeln; *)
    for i:=1 to n do
      marked[i]:=0;
    for i:=1 to n-1 do
      begin
        tmp:=abs(a[i,i]);
        picked:=i;
        forall j:=i to n do
          if (marked[j]=0) and (abs(a[j,i])>tmp) then
             begin
               tmp:=abs(a[j,i]);
               picked:=j;
             end;
        marked[picked]:=1;
        pivot[picked]:=i;
        for j:=1 to n do
          if marked[j]=0 then
            begin
              tmp:=a[j,i]/a[picked,i];
              for k:=i to n do begin
                a[j,k]:=a[j,k] - a[picked,k]*tmp;
                if abs(a[j,k])<1E-10 then a[j,k]:=0;
               end;
              b[j]:=b[j] - b[picked]*tmp;
            end;
      end;
      for i:=1 to n do
        if marked[i]=0 then pivot[i]:=n;
(*        result;    *)

(*  襭 ஢ ⮤ ⭮ ⠭ *)

        for i:=n downto 1 do
         begin
          x[i]:=b[pivot[i]]/a[pivot[i],i];
          forall j:=1 to n do
           begin
            b[pivot[j]]:=b[pivot[j]]-x[i]*a[pivot[j],i];
            a[pivot[j],i]:=0;
           end;
         end;

(*      for i:=1 to n do
                writeln(x[i]:10:1);

      writeln;

      for i:=1 to n do begin
        tmp:=b[i];
        for j:=1 to n do
           tmp:=tmp-x[j]*a[i,j];
        writeln(tmp:10:3);
      end;

      writeln;  *)

end.


    ᫥⥫쭮 ६ 믮 :  2330
    ࠫ쭮     --"--"--"--"--"--:  1980
    ᪮७                         :  1.18
    ⢮ ஢         :  5     ( ⥬ 4  4)



     JACOBI  .

			樮        -
     ⮡  訥, ࠧ०   -
    ⥬ ᣥ஢    ࠡ    묨  ७-
    樠묨 ࠢﬨ,  ᯮ騬    ⮤.
    樮 ⮤   २⢠  묨  -
    ⮤.  ⮤  ଠ쭮 뤠 襭 
    筮 ᫮ 蠣, ..    ⠪ 楤
    ᫥ 筮 ᫠ 権,   ந 筮
    訩 பᨬ騩 ⢥.
	       ⠭⭮ । ,   ⨬
      ⥬   A x = b   । -
    ⭮    x.  , 

	      x_i = 1/a_ii * [ b_i - SUM_j<>i a_ij * x_j ]

	   ᫨    祭 x_j,  j<>i,  
    筮 ᫨  x_i . 筮,     -
    祭 ,   ஡㥬 । ,  ᫨   
    業   ⠪ 祭 x_j,   
    業  x_i . Jacobi     業 
       x ⮡   業 
    x .  ᯮ 祭, ᫥   ६-
     x_i  祭 樨 t ⮡  ஢  
    祭  祭 樨  t + 1 :

       x_i(t+1) = 1/a_ii * [ b_i - SUM_j<>i a_ij * x_j(t) ]

	   Jacobi    ᯠࠫ, ⮬ 
    ᫥   x  室 ६.
     業  x    ன 業  x   祭
    A  b.

	   ᬮਬ ,  믮 ࠫ Jacobi -
      ⨪.   砥 ᮢ 㤠,
      ।,   ⬥  ॡ
    . ।,    ⢥⢥  -
    뢭  ப  A   ᮮ⢥  ⮢  b.
     ⮩ 樥 ,  ⢨  
    ந室          祭      樨
    REPEAT .. UNTIL   横 . 砫,  
       ᥣ  x , ᫥  祭
    ।饩 樨 .  ⥫쭮 ,   
     ।  x   㣨 .
		  -,     -
     쭮 祭 diff  ᭮      
    祭 ᮡ⢥ ⮢ x,     祭
     oꥤ , ⮡ 뤠 쭮 祭
    diff . ⥫쭮,     ᨬ  㬥襭
    室.   蠣 ᨬ쭮  㬥襭,  
     㤥  ⠪ 祭  diff , ஥
     㤥 ⠢   室   REPEAT..UNTIL
    横  ⮩   ᠬ  樨.


program parallel_JACOBI_ALGORITHM1;

 const   n=3;                         (*ࠧ୮  ⥬*)
         e=0.01;                      (*਩ 室-筮 襭*)
 var     a:array[1..n,1..n] of real;  (*樥  ࠢ*)
         b:array[1..n] of real;       (*⠭, ᮮ⢥. ࠢ*)
         x:array[1..n] of real;       (* 業  襭*)
         newx:array[1..n] of real;    (* 業  襭*)
         diff:real;                   (*ᨬ쭮   *)
         i,j:integer;                 (*६ 横*)
         ch:char;

      (* 4 -2  1     3      x1=1              ࠭⨨ 室
        3  6 -2     9      x2=2        ⥬,    
        1 -1  3     8      x3=3          ,

        3 -1  1     9      x1=3        ..   i- ப
        3  7 -2     14     x2=1          [i,i] > SUM( A[i,j] ) , j<>i
        1 -1  4     6      x3=1 *)

 begin
        for i:=1 to n do
          for j:=1 to n do
            begin
(*              writeln(' [',i,',',j,']: ');*)
                readln(a[i,j]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;
   (*砫 業 祭 ⮢ x*)
   for i:=1 to n do
      x[i]:=b[i]/a[i,i]/2;

   (* 樨 業 x  祭 室*)
   repeat
     diff:=0;
     forall i:=1 to n do begin
       newx[i]:=b[i];
       for j:=1 to n do
         if j<>i then
           newx[i]:=newx[i] - a[i,j] * x[j];
       newx[i] := newx[i] / a[i,i];
     end;
     for i:=1 to n do begin
       if diff<abs( x[i] - newx[i] ) then diff:=abs( x[i] - newx[i] );
       x[i]:=newx[i];
     end;
     writeln;
   until diff < e;
(*   for i:=1 to n do write(x[i]:20:3);  *)
end.















    b[j]:=b[j]-x[i]*